#include<stdio.h>
#include<iostream>
#include<stdexcept>

using namespace std; 

int div() {
    int a, b;
    cin >> a >> b;           
    if (b == 0)
        throw invalid_argument("除0错误");
    return a / b;

}

//void Func() {
//// 1、如果p1这里new 抛异常会如何?
//// 2、如果p2这里new 抛异常会如何?
//// 3、如果div调用这里又会抛异常会如何?
//    int* p1 = new int;
//    try
//    {
//        div();
//    }
//    catch(...)
//    {
//        delete p1;
//        cout << "delete:" << endl;
//        throw;
//    }
//
//    delete p1;
//}

//template<class T>
//class SmartPtr
//{
//public:
//    SmartPtr(T* ptr)
//        :_ptr(ptr)
//    {}
//    
//    ~SmartPtr()
//    {
//        delete _ptr;
//        cout << "delete:" << endl;
//    }
//    
//    T& operator*()
//    {
//        return _ptr;
//    }
//
//    T& operator->()
//    {
//        return _ptr;
//    }
//
//private:
//    T* _ptr;
//};
//
//void Func()
//{
//    SmartPtr<int> sp1 = new int;
//    
//    div();
//
//}
//
//int main()
//{
//    try
//    {
//        Func();
//    }
//    catch(const exception& e)
//    {
//       cout << e.what() << endl; 
//    }
//    return 0;
//}


#include"smart_ptr.h"

//int main()
//{
//    xyx::shared_ptr<int> sp1(new int(1));
//    xyx::shared_ptr<int> sp2(new int(1));
//
//    sp1 = sp2;
//    return 0;
//}

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a = 0)" << endl;
	}

	~A()
	{
		cout << this;
		cout << " ~A()" << endl;
	}
//private:

	int _a;
};

// 定制删除器
int main()
{
    xyx::shared_ptr<A> sp2((A*)malloc(sizeof(A)), [](A* ptr) {free(ptr); });
   xyx::shared_ptr<FILE> sp3(fopen("Test.cpp", "r"), [](FILE* ptr) {
           cout << "fclose:" << ptr << endl;
           fclose(ptr);
           });



   return 0;
}
 

